const computeFloat = {
  getDigits (num1, num2) {
    let d1, d2
    const d1Arr = (num1 + '').split('.')[1]
    const d2Arr = (num2 + '').split('.')[1]
    d1 = d1Arr ? d1Arr.length : 0
    d2 = d2Arr ? d2Arr.length : 0
    return {
      d1,
      d2
    }
  },
  compute (num1, num2, type) {
    const {
      d1,
      d2
    } = this.getDigits(num1, num2)
    switch (type) {
      case 'add':
        return this.addDig(num1, num2, d1, d2)
      case 'subtract':
        return this.subtractDig(num1, num2, d1, d2)
      case 'multiply':
        return this.multiplyDig(num1, num2, d1, d2)
      case 'divide':
        return this.divideDig(num1, num2, d1, d2)
    }
  },
  /**
   *
   * @param nums array<Number>
   */
  addNums (nums) {
    if (!nums || !(nums instanceof Array) || nums.length <= 0) {
      return nums
    } else if (nums.length <= 1) {
      return nums[0]
    } else {
      let sumNum = 0
      for (let i = 0; i < nums.length; i++) {
        sumNum = this.add(sumNum, Number(nums[i] || 0))
      }
      return sumNum
    }
  },
  add (num1, num2) {
    const dig = this.getDigits(num1, num2)
    const m = Math.pow(10, Math.max(dig.d1, dig.d2))
    return (num1 * m + num2 * m) / m
  },
  addDig (num1, num2, d1, d2) {
    const m = Math.pow(10, Math.max(d1, d2))
    return (num1 * m + num2 * m) / m
  },
  subtract (num1, num2) {
    const dig = this.getDigits(num1, num2)
    const m = Math.pow(10, Math.max(dig.d1, dig.d2))
    return (num1 * m - num2 * m) / m
  },
  subtractDig (num1, num2, d1, d2) {
    const m = Math.pow(10, Math.max(d1, d2))
    return (num1 * m - num2 * m) / m
  },
  multiply (num1, num2) {
    const dig = this.getDigits(num1, num2)
    const m = Math.pow(10, dig.d1 + dig.d2)
    return ((num1 + '').replace('.', '')) * ((num2 + '').replace('.', '')) / m
  },
  multiplyDig (num1, num2, d1, d2) {
    const m = Math.pow(10, d1 + d2)
    return ((num1 + '').replace('.', '')) * ((num2 + '').replace('.', '')) / m
  },
  divide (num1, num2) {
    const dig = this.getDigits(num1, num2)
    const m = Math.pow(10, dig.d2 - dig.d1)
    return ((num1 + '').replace('.', '')) / ((num2 + '').replace('.', '')) * m
  },
  divideDig (num1, num2, d1, d2) {
    const m = Math.pow(10, d2 - d1)
    return ((num1 + '').replace('.', '')) / ((num2 + '').replace('.', '')) * m
  }
}
export default computeFloat
